package br.com.kaetec.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

import br.com.kaetec.entities.Cliente;
import br.com.kaetec.entities.Contato;
import br.com.kaetec.entities.ContatoType;
import br.com.kaetec.utils.LogDeProcessamento;
import java.util.List;

public class ContatoDAO {

	public static String TABLE = "contatos";
	
	public boolean mantemContato(Cliente cliente) {
                
                boolean transactionOk = false;
		
		for ( int i=0; i < cliente.getContato().size(); i++) {
		
			//-------------------------------------------------
			//- Atualizo o id do cliente no objeto do contato -
			//-------------------------------------------------
			cliente.getContato().get(i).setClienteId( cliente.getId());
			
			if ( cliente.getContato().get(i).getId() > 0 ){
				transactionOk = atualiza(cliente.getContato().get(i));
			}else {
				transactionOk = adiciona(cliente.getContato().get(i));
			}
			
		}
		
                return transactionOk;
	}
	
	private boolean adiciona(Contato contato) {
		
		boolean insertOk = false;
		String sql =	"INSERT INTO " + TABLE + "(" +
						"IDCLIENTE," +
						"TIPO," +
						"CONTEUDO" +												
						")"+
						" VALUES (?,?,?)";

		ConnectionFactory con = new ConnectionFactory( "BD_MYSQL" );
		PreparedStatement stmt = null;
		
		try {
			
			con.beginTransaction();
			
			stmt = con.getPrepareStatementFromSQL(sql, false);

			int index = 0;
			stmt.setLong(++index, contato.getClienteId());
			stmt.setString(++index, contato.getTipoContato().toString());
			stmt.setString(++index, contato.getConteudo());
						  
			stmt.execute();  
			
	        con.endTransaction(null, stmt, null);
	        insertOk = true;
	        
	        LogDeProcessamento.gravaLog(null,"INSERT em " + TABLE + ": executado com sucesso.");
	        
		}
		catch (SQLException e) {  
          
			LogDeProcessamento.gravaLog(null,"INSERT em " + TABLE + ": " + sql.toString() + " com erro!");
			LogDeProcessamento.gravaLog(null, e.getMessage());
	        
		} 
				
		catch (Exception e) {  
          
			LogDeProcessamento.gravaLog(null,"INSERT em " + TABLE + ": " + sql.toString() + " com erro!");
			LogDeProcessamento.gravaLog(null, e.getMessage());
		}
		finally{
			
			con.fecharConexao(null, stmt, null);
			
		}
		
		return insertOk;
		
	}
	
	private boolean atualiza(Contato contato) {
		
		boolean updateOk = false;
		String sql =	"UPDATE " + TABLE + " SET " +
						"IDCLIENTE = ?," +
						"TIPO = ?," +
						"CONTEUDO = ?" +				
						" WHERE ID = ?";
		
		ConnectionFactory con = new ConnectionFactory( "BD_MYSQL" );
		PreparedStatement stmt = null;
		
		try {
			
			con.beginTransaction();
			
			stmt = con.getPrepareStatementFromSQL(sql, false);
			
			int index = 0;
			stmt.setLong(++index, contato.getClienteId());
			stmt.setString(++index, contato.getTipoContato().toString());
			stmt.setString(++index, contato.getConteudo());
			stmt.setLong(++index, contato.getId());
			
			stmt.execute();  
	        
			con.endTransaction(null, stmt, null);
	        updateOk = true;
	        
	        LogDeProcessamento.gravaLog(null,"UPDATE em " + TABLE + ": executado com sucesso.");
	        
		}
		catch (SQLException e) {  
          
			LogDeProcessamento.gravaLog(null,"UPDATE em " + TABLE + ": " + sql.toString() + " com erro!");
			LogDeProcessamento.gravaLog(null, e.getMessage());
	        
		} 
		catch (Exception e) {  
          
			LogDeProcessamento.gravaLog(null,"UPDATE em " + TABLE + ": " + sql.toString() + " com erro!");		
			LogDeProcessamento.gravaLog(null, e.getMessage());
		}
		finally{
			
			con.fecharConexao(null, stmt, null);
			
		}
			
		return updateOk;
		
	}
	
	public boolean exclui(Cliente cliente) {
		
		boolean deleteOk = false;
		String sql;
				
		ConnectionFactory con = new ConnectionFactory( "BD_MYSQL" );
		PreparedStatement stmt = null;
		
		for ( int i=0; i < cliente.getContato().size(); i++) {
		
			deleteOk = false;
			
			sql = 	"UPDATE " + TABLE + " SET " +
					"DEL = '*' " +
					" WHERE ID = ?";
			
			try {
				
				con.beginTransaction();
				
				stmt = con.getPrepareStatementFromSQL(sql, false);
				
				stmt.setLong(1, cliente.getContato().get(i).getId());
		  
				stmt.execute();  
		        
                                con.endTransaction(null, stmt, null);
                                deleteOk = true;
		        
                                LogDeProcessamento.gravaLog(null,"DELETE em " + TABLE + ": executado com sucesso.");
		        
			}
			catch (SQLException e) {  
	          
				LogDeProcessamento.gravaLog(null,"DELETE em " + TABLE + ": " + sql.toString() + " com erro!");
				LogDeProcessamento.gravaLog(null, e.getMessage());
		        
			} 
			catch (Exception e) {  
	          
				LogDeProcessamento.gravaLog(null,"DELETE em " + TABLE + ": " + sql.toString() + " com erro!");		
				LogDeProcessamento.gravaLog(null, e.getMessage());
			}
			finally{
				
				con.fecharConexao(null, stmt, null);
				
			}
			
		}
		
		return deleteOk;
		
	}
	
	public static ArrayList<Contato> getContatosFromClienteId( Cliente cliente ) {
		
		try {
			
			ArrayList<Contato> contatos = new ArrayList<Contato>();
			ConnectionFactory con = new ConnectionFactory( "BD_MYSQL" );
			String sql = "SELECT * FROM " + TABLE + " WHERE DEL = ' ' AND IDCLIENTE = ?";
			
			con.beginTransaction();
			PreparedStatement stmt = con.getPrepareStatementFromSQL(sql, false);
			stmt.setLong(1, cliente.getId());
			
			ResultSet rs = stmt.executeQuery();

			while(rs.next()) {
				
				Contato contato = new Contato();
				
				//---------------------------
				//- Popula o objeto contato -
				//---------------------------
				contato.setId(rs.getLong("ID"));
				contato.setConteudo(rs.getString("CONTEUDO"));
				
				//-----------------------------------------------
				//- Tratamento de dados do Enum tipo de contato -
				//-----------------------------------------------
				switch (rs.getString("TIPO")) {
				
					case "A":
						contato.setTipoContato(ContatoType.A);
						break;
					
					case "B":
						contato.setTipoContato(ContatoType.B);
						break;

					case "C":
						contato.setTipoContato(ContatoType.C);
						break;
						
					case "D":
						contato.setTipoContato(ContatoType.D);
						break;
					
					default:
						break;
				}
				
				//-------------------------------
				//- Adiciona o contato na lista -
				//-------------------------------
				contatos.add(contato);
			}

			con.endTransaction(null, stmt, rs);

			return contatos;
			
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
        }

}